package com.Shuang.proxy1;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyUtil {
    public static StarProxy createProxy(BigStar bigStar){

        // 1 创建代理
        /*newProxyInstance(ClassLoader loader,
                Class<?>[] interfaces,
                InvocationHandler h)

                1 指定一个类加载器，用当前类的 类加载器去加载生成的这个类的代理类
                2 指定要实现的是什么样的代理，也就是代理都有哪些方法，要实现大明星的唱歌跳舞方法就把 StarProxy类型给初始化出来
                3 指定代理要做的事情 是一个接口，要使用它的匿名内部类
                */

        StarProxy starProxy = (StarProxy) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(),
                new Class[]{StarProxy.class}, new InvocationHandler() {
                    @Override //回调方法
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        if (method.getName().equals("sing")){
                            //说明在用代理执行唱歌的方法
                            System.out.println("准备话筒");
                            return method.invoke(bigStar, args);//调用明星的唱歌方法来唱歌，args是明星唱歌函数的参数 调完返回出去
                        }else if (method.getName().equals("dance")){
                            //说明用代理执行跳舞方法
                            System.out.println("准备场地~");
                            return method.invoke(bigStar, args);  //调用明星的跳舞方法 调完返回出去
                        }else {
                            //说明没有用代理执行方法，直接用大明星自己的方法 然后返回出去
                            return method.invoke(bigStar, args);
                        }
                    }
                }
        );

        return starProxy;
    }
}
